package com.ydl.learning.scala

/**
  * self type
  * 自类型
  * 语法是 aa: 类型 =>
  * aa具体是啥无所谓，this，self都可以
  *
  * @author ydl
  * @since 2021/3/18
  */
class SelfType {

  trait User {
    def userName: String

    val age: Int
  }

  trait Tweeter {
    //定义自类型
    self: User =>
    val sex: String

    //反编译class之后会发现，所有的方法都自动加上了this参数，此时入参的this的类型是Tweet，当使用userName时，会将this强制类型转换成User，
    def tweet(tweetText: String): Unit = println(userName + tweetText + age + sex)

  }

  class VerifiedTweeter(val username_ : String) extends Tweeter with User {  // 混入特质 User 因为 Tweeter 需要
    override def userName = s"real $username_"

    override val sex: String = ""
    override val age: Int = 0
  }


}
